﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.IO;
using System.Collections;
using produccion.AccesoDatos;
using produccion.modulos;
using produccion.Conexion;

using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.Data;
using System.Threading;
using System.Globalization;
using System.Reflection;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMlogin.xaml
    /// </summary>
    public partial class FRMlogin : Window
    {
        MDOgeneral MdoGeneral = new MDOgeneral();

        public FRMlogin()
        {
            InitializeComponent();
        }

        private void butMin_Click(object sender, RoutedEventArgs e)
        {
            this.WindowState = WindowState.Minimized;
        }

        private void butCerrar_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                MDOgeneral.DesconectarBogota();//FJRF - Si esta conectado nos desconectamos

                MDOgeneral.logBusquedadAbierta = false;
                MDOgeneral.logLogin = false;
                MDOgeneral.strEmpresaConectada = "ART";

                string strLinea = "";
                String StrParametro = "";//FJRF - Variable que contiene el parametro de la linea leida
                int IntLength = 0;//FJRF - Variable que contiene la longitud de la cadena completa
                
                MDOgeneral.DtImpresorasCodigoBarras.Columns.Add("IMPRESORA", System.Type.GetType("System.String"));//FJRF - CREAMOS LA COLUMBA DE LA IMPRESORAS
                MDOgeneral.DtImpresorasCodigoBarras.Columns.Add("RUTAIMPRESORA", System.Type.GetType("System.String"));//FJRF - CREAMOS LA COLUMBA DE LA RUTA DE LA IMPRESORA

                //StreamReader objReader = new StreamReader("c:\\Produccion\\BDSIA.INI");
                StreamReader objReader = new StreamReader("BDSIA.INI");
                login.Instance.lisplano.Clear();
                while (strLinea != null)
                {
                    strLinea = objReader.ReadLine();
                    if (strLinea != null && strLinea.Trim().Length > 0)
                    {
                        if (strLinea.Substring(0, 2) == "BD")
                        {
                            login.plano xplano = new login.plano();
                            xplano.strTipo = strLinea.Substring(0, 4).Trim();
                            xplano.strNombre = strLinea.Substring(4, 20).Trim();
                            xplano.strTnsNames = strLinea.Substring(24).Trim();
                            login.Instance.lisplano.Add(xplano);
                        }
                        if (strLinea.Substring(0, 3) == "PLA")//FJRF - PLA: Es la ruta de los planos
                        {
                            IntLength = strLinea.Length - 4;//FJRF - Mandamos el tamaño de la cadena a leer menos el dato del parametro inicial
                            StrParametro = strLinea.Substring(4, IntLength).Trim();//FJRf - Se lee la ruta de donde se guardaran los documentos a imprimir
                            MDOgeneral.strRutaImpresionDocumentos = StrParametro;//FJRF - Se envia el dato encontrado
                        }
                        if (strLinea.Substring(0, 3) == "IMP")//FJRF - IMP: Es para saber que impresora tomara cada usuario
                        {
                            IntLength = strLinea.Length - 4;//FJRF - Mandamos el tamaño de la cadena a leer menos el dato del parametro inicial
                            StrParametro = strLinea.Substring(4, IntLength).Trim();//FJRf - Se lee la informacion del LTP2 para las impresoras de matriz de punto
                            MDOgeneral.strImpresionLPT2 = StrParametro;//FJRF - Se envia el dato encontrado
                        }
                        if (strLinea.Substring(0, 3) == "IBR")//FJRF - IMP: Es para saber que impresora tomara cada usuario
                        {
                            IntLength = strLinea.Length - 4;//FJRF - Mandamos el tamaño de la cadena a leer menos el dato del parametro inicial
                            StrParametro = strLinea.Substring(4, IntLength).Trim();//FJRf - Se lee la informacion del LTP2 para las impresoras de matriz de punto

                            //FJRF - Creamos una nueva fila
                            MDOgeneral.drAgregarDatosImpresora = MDOgeneral.DtImpresorasCodigoBarras.NewRow();
                            //FJRF - Insertamos los datos
                            MDOgeneral.drAgregarDatosImpresora["IMPRESORA"] = MdoGeneral.PasarCadenaYRetornarCodigoONombre(StrParametro, " ", "Codigo");
                            MDOgeneral.drAgregarDatosImpresora["RUTAIMPRESORA"] = MdoGeneral.PasarCadenaYRetornarCodigoONombre(StrParametro, " ", "Nombre");
                            //FJRF - ASIGNAMOS LOS DATOS ENCONTRADOS DE LAS IMPRESORAS
                            MDOgeneral.DtImpresorasCodigoBarras.Rows.Add(MDOgeneral.drAgregarDatosImpresora);
                        }
                        if (strLinea.Substring(0, 3) == "EMP")//HMVR - EMP: Es para saber que empresa se conecta ARTESA O PELLE
                        {
                            IntLength = strLinea.Length - 4;//FJRF - Mandamos el tamaño de la cadena a leer menos el dato del parametro inicial
                            StrParametro = strLinea.Substring(4, IntLength).Trim();//FJRf - Se lee la informacion del LTP2 para las impresoras de matriz de punto
                            MDOgeneral.strEmpresaConectada = StrParametro;//FJRF - Se envia el dato encontrado
                        }
                    }
                }

                objReader.Close();
                texUsu.Select(0, 0);
                cmbBD.SelectedIndex = 0;
                texUsu.Focus();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void butEntrar_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                login.Instance.clave = texCla.Password;
                login.Instance.loguear();
                if (MDOgeneral.EstLogIn)
                {
                    MDOgeneral.logLogin = true;
                    this.Close();
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            login.Instance = null;
        }

        
    }
    
    public class login:ObservableObject 
    {

        #region singleton

        private static login instance = null;

        protected login() { }

        public static login Instance
        {
            get 
            {
                if (instance == null)
                    instance = new login();
                return instance;
            }
            set 
            { 
                if (instance != null)
                    instance = null;
            }
        }

        #endregion


        private List<plano> _lisplano = new List<plano>();
        public List<plano> lisplano
        {
            get { return _lisplano; }
            set { _lisplano = value; RaisePropertyChangedEvent("lisplano"); }
        }

        private plano _selplano;
        public plano selplano
        {
            get { return _selplano; }
            set { _selplano = value; base.OnPropertyChanged("selplano"); }
        }

        private string _strBD;
        public string strBD
        {
            get { return _strBD; }
            set { _strBD = value; RaisePropertyChangedEvent("strBD"); }
        }

        private string _usuario;
        public string usuario 
        {
            get { return _usuario; }
            set { _usuario = value; RaisePropertyChangedEvent("usuario"); }
        }

        private string _clave;
        public  string clave 
        {
            get { return _clave; }
            set { _clave = value; RaisePropertyChangedEvent("clave"); }
        }

        private List<string> _listaBD = new List<string>();
        public List<string> listaBD
        {
            get { return _listaBD; }
            set { _listaBD = value; RaisePropertyChangedEvent("listaBD"); }
        }

        public void loguear() 
        {
            MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Creamos una instancia de MdoGeneral
            String StrDato = "";//FJRF - Lo usamos para validar datos antes de la asignacion
            DateTime DttFecha = DateTime.Now;//FJRF - Para saber la fecha actual
            try
            {
                MDOgeneral.strBD = selplano.strTnsNames;
                MDOgeneral.strUsu = usuario.ToUpper();
                MDOgeneral.strCla = clave.ToUpper();
                ProcesoProduccionRepositorio.baseDatos = selplano.strTnsNames;
                OracleConexion.strCla = clave;
                OracleConexion.strUsu = usuario;
                ImprimirFactura.strBaseDatos = selplano.strTnsNames;
                ImprimirFacturaVarios.strBaseDatos = selplano.strTnsNames;

                clases.CLSMAEUSUP log = new clases.CLSMAEUSUP { CODUSU_USU = usuario, PASUSU_USU = clave };
                MDOgeneral.EstLogIn = log.ClaveValida();
                
                if (MDOgeneral.EstLogIn)
                {
                    MDOgeneral.usuario = usuario;
                    MDOgeneral.strEmpresaImprimeNit = MdoGeneral.StrRetornarUnSoloCampo("NIT_CFG", "NIT", "CFGEMPP", "");//FJRF - TRAEMOS EL NIT DE LA EMPRESA
                    MDOgeneral.strEmpresaImprime =  MdoGeneral.StrRetornarUnSoloCampo("RAZSOC_CFG", "EMPRESA", "CFGEMPP","");//FJRF - TRAEMOS EL NOMBRE DE LA EMPRESA
                    MDOgeneral.strEmpresaImprimeDireccion = MdoGeneral.StrRetornarUnSoloCampo("'DIRECCIÓN: ' || DIRCOM_CFG  || ' TELÉFONO: ' || TELCOM_CFG", "DIRECCION", "CFGEMPP","");//FJRF - TRAEMOS LA DIRECCION Y EL TELEFONO DE LA EMPRESA JUNTOS
                    MDOgeneral.strEmpresaImprimeCiudad = MdoGeneral.StrRetornarUnSoloCampo("CIUDAD_CFG", "CIUDAD", "CFGEMPP", ""); // TRae la ciudad
                    MDOgeneral.strEmpresaImprimeFax = MdoGeneral.StrRetornarUnSoloCampo("FAXCOM_CFG", "FAX", "CFGEMPP", ""); // TRae el FAX
                    MDOgeneral.strEmpresaImprimeSoloDireccion = MdoGeneral.StrRetornarUnSoloCampo("DIRCOM_CFG", "DIRECCION", "CFGEMPP", ""); // TRae la direccion
                    MDOgeneral.strEmpresaImprimeSoloTelefono = MdoGeneral.StrRetornarUnSoloCampo("TELCOM_CFG", "TELEFONO", "CFGEMPP", ""); // TRae el telefono
                    
                    StrDato = MdoGeneral.StrRetornarUnSoloCampo("NOM_CON ", "ANO", "CONTROLP", "ID_CON = 'ANO' AND COD_CON = 'ACT'");//FJRF - Extraemos el año de validación para el sistema
                    if (StrDato == "DATO NO ENCONTRADO")//FJRF - Si el año de validación no existe hacemos lo siguiente
                    {
                        Msgbox("PROCESO DE ENTRADA AL SISTEMA CANCELADO", "En la base de datos no esta configurado el año del validación del sistema, consulte con el administrador del sistema.", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Envimos un mensaje al usuario
                    }
                    else//FJRF - Si el año de validacion si existe hacemos lo siguiente
                    {
                        MDOgeneral.IntAñoDeValidacionEnElSistema = int.Parse(StrDato);//FJRF - Asignamos el año a la variable publica para hacer las validaciones en los modulos que se requiera

                        StrDato = MdoGeneral.StrRetornarUnSoloCampo("NOM_CON ", "ANO", "CONTROLP", "ID_CON = 'MES' AND COD_CON = 'ACT'");//FJRF - Extraemos el mes de validación para el sistema
                        if (StrDato == "DATO NO ENCONTRADO")//FJRF - Si el mes de validación no existe hacemos lo siguiente
                        {
                            Msgbox("PROCESO DE ENTRADA AL SISTEMA CANCELADO", "En la base de datos no esta configurado el mes del validación del sistema, consulte con el administrador del sistema.", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Enviamos un mensaje al usuario
                        }
                        else//FJRF - Si el mes de validacion si existe hacemos lo siguiente
                        {
                            MDOgeneral.IntMesDeValidacionEnElSistema = int.Parse(StrDato);//FJRF - Asignamos el mes a la variable publica para hacer las validaciones en los modulos que se requiera

                            #region FJRF - CreamosLasFechasDeValidacionDelSistema [FechaActual] - [FechaInicial] - [FechaFinal]

                            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
                            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
                            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

                            MDOgeneral.DttFechaActualDeValidacionEnElSistema = new DateTime(MDOgeneral.IntAñoDeValidacionEnElSistema, MDOgeneral.IntMesDeValidacionEnElSistema, DttFecha.Day);//FJRF - Creamos la fecha actual que debe de tener el sistema
                            MDOgeneral.DttFechaInicialDeValidacionEnElSistema = new DateTime(MDOgeneral.IntAñoDeValidacionEnElSistema, MDOgeneral.IntMesDeValidacionEnElSistema, 1);//FJRF - Creamos el rango de fechas inicial en el que debe trabajar el sistema
                            MDOgeneral.DttFechaFinalDeValidacionEnElSistema = new DateTime(MDOgeneral.IntAñoDeValidacionEnElSistema, MDOgeneral.IntMesDeValidacionEnElSistema + 1, 1).AddDays(-1);//FJRF - Creamos el rango de fechas final en el que debe trabajar el sistema

                            MDOgeneral.StrRutaAplicacion = Directory.GetParent(Assembly.GetExecutingAssembly().Location) + "\\";//FJRF - Para saber la ruta de la aplicacion
                            MDOgeneral.StrRutaAplicacionReportes = Directory.GetParent(Assembly.GetExecutingAssembly().Location) + "\\reportes\\";//FJRF - Para saber la ruta de los reportes
                            #endregion

                            FRMmenu f = new FRMmenu();//FJRF - Instanciamos el modulo de ingreso al sistema
                            f.Show();//FJRF - Permitimos la entrada al sistema si las condiciones anteriores se cumplen
                        }
                    }
                }
                else
                {
                    msn.tipo = false;
                    msn.texto = "El usuario o la clave ingresada son invalidos.";
                }
            }
            catch (Exception ex) { throw ex; }
        }

        private MDOgeneral.mensaje _msn=new MDOgeneral.mensaje();
        public MDOgeneral.mensaje msn 
        {
            get { return _msn; }
            set { _msn = value; RaisePropertyChangedEvent("msn"); }
        }

        public class plano: ObservableObject
        {
            public string strTipo { get; set; }
            public string strNombre { get; set; }
            public string strTnsNames { get; set; }
        }

        #region FJRF - MsgboxPersonalizado
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion
    }
}
